package com.zhj.rabbitmq.demo3;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @program: rabbimmq-demo
 * @description: 交换机 fanout模式 消息发送
 * @author: zhengjibin
 * @create: 2020-11-17 09:15
 * @Version 1.0
 **/
public class ExchangeFanoutSendMessage {

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        //配置rabbitmq的链接信息
        factory.setHost("122.112.198.94");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        Connection connection = null;// 定义rabbitmq的网络连接 ，一个连接
        Channel channel = null;//定义一个链接中的通道
        connection = factory.newConnection();//通过工厂获得连接
        channel = connection.createChannel();//通过连接获得通道

        /**
         * 由于是 fanout模式的交换机，是广播模式，没法确定消费者 队列有多少个
         * 所以将不再生产端 创建队列和 队列绑定交换机
         * 只有声明一个交换机就行了
         */
        //String queueName = "demo2_queue";
        //channel.queueDeclare(queueName,true,false,false,null);
        String exchangeName = "fanout_exchange";
        //String routingkey = "demoRoutingKey";
        //channel.queueBind(queueName,exchangeName,routingkey);

        channel.exchangeDeclare(exchangeName,"fanout",true);

        String message = "fanout交换机消息wqeqwe";
        /*
            发送消息
            参数1：交换机名称，空字符串表示不使用交换机
            参数2：表示队列名或routingkey，当指定了交换机名称后，这个值就是routingkey。没有指定交换机就表示队列名称
            参数3：参数属性，一般为空
            参数4：消息内容的字节数组
            注意：发送前，必须确认交换机和消息队列已经成功创建，并且确认交换机已经绑定到消息队列
         */
        /*
            注意：此方法的 routingkey 是指定消息的 routingkey 。消息中的routingkey 必须和 交换机和消息队列绑定是binding规则中的bindingkey一直
         */
        channel.basicPublish(exchangeName,"",null,message.getBytes("UTF-8"));

        System.out.println("消息发送成功");

        channel.close();
        connection.close();
    }
}
